package cn.tedu.thread;
/*本类用于多线程编程实现方案1:继承Thread类的方式来完成*/
public class TestThread1 {
    public static void main(String[] args) {
        //4,创建线程对象进行测试
        /*4,new对应的线程新建状态
        * 5,要想模拟多线程,至少得启用2个线程
        * 如果只启动1个线程,是单线程程序  */
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        MyThread t3 = new MyThread();
        MyThread t4 = new MyThread();
        /*6,这个run()如果直接这样调用,是没有多线程抢占执行的效果的
        * 这个方法只是把代码看作是普通方法来调用,谁先调用,谁先执行*/
//        t1.run();
//        t2.run();
        //t3.run();
       // t4.run();
        /*7,start()对应的状态是就绪状态,会把刚刚新建好的线程加入到就绪队列中
        * 至于这个线程什么时候执行,这就是多线程执行的随机性需要等待OS选中并分配CPU
        * 8,线程的执行具有随机性,也就是t1~t4具体怎么执行
        * 取决于CPU的调度与时间片的分配,我们是决定不了的
        * 9,执行start()时,底层会自动调用我们重写的,包含自己业务的run()
        * */
        t1.start();
        t2.start();
//        t3.start();
//        t4.start();
    }

}
//1,自定义一个多线程类
class MyThread extends Thread{
    /*1,多线程编程实现方案1:继承Thread类+重写run()*/
    //2,重写run(),里面是我们自己的方法
    @Override
    public void run() {
        /*2,super.run()调用的是父类的业务,
        * 我们现在想用自己的业务,所有注释掉*/
        //super.run();
        //3,完成自己的业务:打印10次当前执行的线程名称
        for (int i = 0; i <10; i++) {
            /*3,getName()方法表示获取当前正在执行的线程名称
            * 由于本类继承了Thread类,所以可以直接使用thread类的这个方法*/
            System.out.println(i+"="+getName());
        }

    }
}